#!/usr/bin/env python3
# coding:utf-8
# __author:"Xu.rt"
# date: 2017/9/17
'''
基础实战：《密码管理器》
'''
import string, random, pickle

def login_user():
    # 登录密码管理器
    i = 0
    while i < 3 :
        passwd = input('请输入密码（初始密码为：222222）：')
        if passwd == '222222':
            print('欢迎回来！！！\n')
            return True
        else:
            i +=1
            print('密码错误，请重新输入（最多输入三次，已经错误{}次）'.format(i))
    else:
        print('已经错误三次，请一秒钟后继续输入！！！')
        # return False

def option():
    # 功能选择
    while True:
        chose = input('1、保存密码 \n2、自动生成安全密码 \n3、获取密码 \n请选择你想要的功能（1-3，按任意键退出）：')
        if chose == '1':
            save_passwd()
        elif chose == '2':
            auto_passwd()
        elif chose == '3':
            get_passwd()
        else:
            print('正在退出…………\n欢迎下次再来！！！')
            break

def save_passwd():
    # 选择密码类型
    def input_passwd(passwd_dict, file_name):
        # 保存密码
        passwd_title = input('请输入密码标题：')
        usr_passwd = input('请输入密码：')
        try:
            with open(file_name, 'rb') as file_in:
                passwd_dict = pickle.load(file_in)
                if passwd_dict.get(passwd_title) == None:
                    passwd_dict.setdefault(passwd_title, usr_passwd)
                    # print(passwd_dict)
                else:
                    seclct = input('此标题已经存在，是否覆盖？？（Y/N）')
                    if seclct == 'Y' or seclct == 'y':
                        passwd_dict[passwd_title] = usr_passwd
                        print('密码已成功覆盖！！')
                        # print(passwd_dict)
        except (EOFError, IOError):
            with open(file_name, 'wb') as f:
                passwd_dict.setdefault(passwd_title, usr_passwd)
                pickle.dump(passwd_dict, f)
        else:
            with open(file_name, 'wb') as f:
                pickle.dump(passwd_dict, f)

    app_passwd    = {}
    web_passwd    = {}
    bank_passwd   = {}
    server_passwd = {}
    while True:
        choose_type = input('1、APP密码 \n2、WEB密码 \n3、银行密码 \n4、服务器密码 \n请选择要储存的密码类型（1-4，任意键退出）：')
        if choose_type == '1':
            input_passwd(app_passwd, 'app_passwd.pkl')
        elif choose_type == '2':
            input_passwd(web_passwd, 'web_passwd.pkl')
        elif choose_type == '3':
            input_passwd(bank_passwd, 'bank_passwd.pkl')
        elif choose_type == '4':
            input_passwd(server_passwd, 'server_passwd.pkl')
        else:
            break

def auto_passwd():
    # 自动生成安全密码
    pwl = string.ascii_letters   # 获取大小写字母
    pwd = string.digits          # 获取数字
    pwp = string.punctuation     # 获取特殊符号
    while True:
        try:
            passwd_bit = int(input('请输入密码的位数（最少6位，最多11位）：'))
            passwd = passwdl = passwdd = passwdp = ''
            if passwd_bit > 5 and passwd_bit < 12:
                countl = random.randrange(1, passwd_bit - 1)
                countd = random.randrange(1, passwd_bit - countl)
                countp = (passwd_bit - countl - countd)
                for l in random.sample(pwl, countl):passwdl += l
                for i in random.sample(pwd, countd):passwdd += i
                for j in random.sample(pwp, countp):passwdp += j
                passwd = passwdl + passwdd + passwdp
                print(passwd)
                select = input('继续请按任意键，退出请按Q(q)：')
                if (select == 'q') or (select == 'Q'):
                    break
            else:
                print('长度输入有误，请重新输入！！！')
        except Exception:
            print('输入有误，请输入正确的数字!!!!')

def get_passwd():
    # 获取密码
    def out_put(file_name):
        # 获取密码流程
        try:
            with open(file_name, 'rb') as f:
                passwd_dict = pickle.load(f)
                passwd_list = list(passwd_dict.keys())
                print('目前保存的密码标签有：', end='')
                print(passwd_list)
                passwd_key = input('请输入密码标签：')
                if passwd_dict.get(passwd_key) == None:
                    print('你输入去标签不存在，请输入正确的标签！！')
                else:
                    print('标签为：', passwd_key, ' 密码为：', passwd_dict[passwd_key])
        except IOError:
            print('目前没储存密码，请先存储密码！！！')
            # except Exception:
            #     print('输入错误，请重新输入……')

    while True:
        choose_type = input('1、APP密码 \n2、WEB密码 \n3、银行密码 \n4、服务器密码 \n请选择要获取的密码类型（1-4，任意键退出）：')
        if choose_type == '1':
            out_put('app_passwd.pkl')
        elif choose_type == '2':
            out_put('web_passwd.pkl')
        elif choose_type == '3':
            out_put('bank_passwd.pkl')
        elif choose_type == '4':
            out_put('server_passwd.pkl')
        else:
            break

if __name__ == '__main__':
    if login_user():
        option()
